import 'package:sqflite/sqflite.dart';

// 表名
const String tableName = 'table_test';
// id字段
const String columnId = 'id';
// title字段
const String columnTitle = 'title';
// done字段
const String columnDone = 'done';
// 定义一个Test类对象与数据库字段一一对应
class Test {
  int? id;
  String? title;
  bool? done;
  // 将Test对象转换为Map对象，返回一个Test实例，方便存入数据库
  Map<String, dynamic> toMap() {
    var map = <String, dynamic>{
      columnTitle: title,
      columnDone: done == true ? 1 : 0
    };
    if (id != null) {
      map[columnId] = id;
    }
    return map;
  }
  // 生成构造函数
  Test();
  // 命名构造函数，通过一个Map(Map<String, dynamic>的参数初始化一个Test实例
  Test.fromMap(Map<String, dynamic> map) {
    id = map[columnId];
    title = map[columnTitle];
    done = map[columnDone] == 1;
  }
}

// 使用TableTestProvider类封装了table_test表相关的所有操作
class TableTestProvider {
  Database? db;
  // 打开数据库，并创建table_test表
  Future open(String path) async {
    db = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      await db.execute('''
create table $tableName ( 
  $columnId integer primary key autoincrement, 
  $columnTitle text not null,
  $columnDone integer not null)
''');
    });
  }
  // 插入数据
  Future<Test> insert(Test test) async {
    test.id = await db?.insert(tableName, test.toMap());
    return test;
  }
  // 查询表里对应的id字段的记录
  Future<Test> getTodo(int id) async {
    List<Map<String,dynamic>> maps = await db!.query(tableName,
        columns: [columnId, columnDone, columnTitle],
        where: '$columnId = ?',
        whereArgs: [id]);
    if (maps.isNotEmpty) {
      return Test.fromMap(maps.first);
    }
    return Test();
  }
  // 删除表里对应的id字段的记录
  Future<int> delete(int id) async {
    return await db!.delete(tableName, where: '$columnId = ?', whereArgs: [id]);
  }
  // 修改表里的某条记录
  Future<int> update(Test test) async {
    return await db!.update(tableName, test.toMap(),
        where: '$columnId = ?', whereArgs: [test.id]);
  }
  // 关闭数据库
  Future close() async => db!.close();
}